package cn.autumnorange.app.common.repository;

import cn.autumnorange.app.common.service.Persistable;
import org.hibernate.type.Type;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public interface AbstractRepository<X extends Persistable, I extends Serializable>
        extends AbstractPersisTableRepository<I> {
    Class<X> getClazz();

    X save(X entity);

    X update(X entity);

    X saveOrUpdate(X entity);

    X findById(I id);

    List<X> findByFiled(String filed, Object o);

    /**
     * 多个字段的查询
     *
     * @param linkedHashMap 将你的字段传入map中
     * @return
     */
    List<X> findByFileds(LinkedHashMap<String, Object> linkedHashMap);

    List<X> findAll();

    List<X> findByNativeQuery(String sql, Map<String, Object> conditionParams, Map<String, Type> scalar);

    /**
     * 一个字段的分页
     *
     * @param filed    字段名
     * @param o        字段参数
     * @param pageNo   第几页
     * @param pageSize 一个页面多少条数据
     * @return
     */
    List<X> findPageByQueryFiled(String filed, Object o, int pageNo, int pageSize);

    /**
     * 多字段查询分页
     *
     * @param pageNo          第几页
     * @param pageSize        一个页面的条数
     * @param conditionParams
     * @return
     */
    Map<String, Object> findPageByNativeQueryFileds(
            String sql, Map<String, Object> conditionParams, Integer pageNo, Integer pageSize);

    Integer updateFileds(
            String hql, Map<String, Object> conditionParams, Map<String, Object> valueParams);

    /**
     * 只能删除持久状态的实体
     *
     * @param entity
     */
    boolean remove(X entity);

    /**
     * 根据表的id删除数据
     */
    boolean deleteById(I id);

    /**
     * 根据参数删除表数据
     */
    boolean deleteByMap(Map paramsMap);

    /**
     * 根据参数删除表数据
     */
    boolean deleteByMap(Map paramsMap, String hql);

    /**
     * 根据id查询
     *
     * @param t
     * @param idClass
     * @return
     */
    X findByIdClass(X t, Object idClass);

    X first(String hql);

    X first(String hql, Object arg);

    X first(String hql, Object arg, Object arg2);

    X first(String hql, Object... args);

    // ---------------------------------single
    X single(String hql);

    X single(String hql, Object arg);

    X single(String hql, Object arg, Object arg2);

    X single(String hql, Object... args);

    // ---------------------------------list
    List<X> list(String hql);

    List<X> list(String hql, Object arg);

    List<X> list(String hql, Object arg, Object arg2);

    List<X> list(String hql, Object... args);

    // ---------------------------------top
    List<X> top(int top, String hql);

    List<X> top(int top, String hql, Object arg);

    List<X> top(int top, String hql, Object arg, Object arg2);

    List<X> top(int top, String hql, Object... args);
}
